#ifndef PARTSSTACKEDBARWIDGET_HPP
#define PARTSSTACKEDBARWIDGET_HPP

#include "assembly/widget/PartsChartWidget.hpp"
#include "store/struct/DurationCarrier.hpp"
#include "tool/TimeHelper.hpp"
#include <QtCharts/QLineSeries>
#include <QDebug>
#include <QPen>

/**
 * @brief 堆叠图部件
 *
 * 特性：
 * 1. 继承自 PartsChartWidget。
 * 2. 提供可选的固定宽度和高度，-1 表示自适应父容器。
 * 3. 启用鼠标操作（缩放、拖拽）。
 * 4. 使用 `addStackedBar` 函数添加水平堆叠柱状图数据。
 */
class PartsStackedBarWidget : public PartsChartWidget {
    Q_OBJECT

public:
    /**
     * @brief 构造函数。
     * @param w 宽度，-1 表示自适应。
     * @param h 高度，-1 表示自适应。
     * @param parent 父窗口。
     */
    inline explicit PartsStackedBarWidget(int w = -1, int h = -1, QWidget* parent = nullptr)
        : PartsChartWidget(parent) {
        // 设置控件大小策略
        setChartSize(w, h);

        // 启用鼠标操作
        setMouseOperationEnabled(true);

        // 确保 Y 轴为分类型
        setYAxisType("category");

        // 可选设置
        chart->legend()->show();
        chart->setAnimationOptions(QChart::SeriesAnimations);
    }

    /**
     * @brief 析构函数。
     */
    inline virtual ~PartsStackedBarWidget() override {
        // Qt 会自动清理子对象
    }

    /**
     * @brief 设置堆叠图数据。
     * @param currentDurations 数据载体。
     */
    inline void setPartsStackedData(const QList<DurationCarrier> &currentDurations) {
        if (currentDurations.isEmpty()) {
            qWarning() << "没有数据点可用于绘图。";
            return;
        }

        // 清除所有已有的系列
        clearAllSeries();

        // 调用父类的 addStackedBar
        addStackedBar(currentDurations);
    }

protected:
    /**
     * @brief 清除所有系列并删除它们（可选重写）。
     */
    inline void clearAllSeries() {
        PartsChartWidget::clearAllSeries();
    }

private:
    /**
     * @brief 设置控件大小策略。
     */
    inline void setChartSize(int w, int h) {
        if (w == -1 && h == -1) {
            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        } else if (w == -1) {
            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            setFixedHeight(h);
        } else if (h == -1) {
            setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
            setFixedWidth(w);
        } else {
            setFixedSize(w, h);
        }
    }
};

#endif // PARTSSTACKEDBARWIDGET_HPP
